/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   15-1-15 下午6:48 Created by dwzhang
 */
package com.jade.modules.cms;

import java.util.List;

import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;

/**
 * 分类管理接口。
 *
 * @author <a href="mailto:dwzhang@xunton.com">dwzhang</a> 
 * @version 1.0 15-1-15 下午6:48
 */
public interface CategoryManager
{
    /**
     * 添加内容分类。
     *
     * @param cmsCategory 分类信息
     */
    public void add(CmsCategory cmsCategory)
            throws CmsException;

    /**
     * 更新内容分类。
     *
     * @param cmsCategory 分类信息
     */
    public void update(CmsCategory cmsCategory)
            throws CmsException;

    /**
     * 更新内容分类状态。
     *
     * @param status 分类状态
     * @param ids 分类标识数组
     */
    public void updateStatus(int status, long... ids)
            throws CmsException;

    /**
     * 获取内容分类信息。
     *
     * @param id:内容分类id
     * @param children:是否需要获取该内容分类下的所有子内容分类
     * @return 内容信息。
     */
    public CmsCategory get(long id, boolean children);

    /**
     * 获取内容分类，同时设置上相应的flag.
     *
     * @return 分类信息
     */
    public CmsCategory getWithFlag(long id);

    /**
     * 删除内容分类。
     *
     * @param ids 内容标识
     */
    public void remove(long... ids)
            throws CmsException;

    /**
     * 获取某一个内容分类下面的子内容分类。
     *
     * @param ownerType 所有者类型
     * @param ownerId 所有者标识
     * @param parentId 父内容分类id
     * @param recursion:是否需要递归查询出所有子内容分类
     * @return 子分类列表。
     */
    public List<CmsCategory> listChildren(String ownerType, String ownerId, long parentId, boolean recursion);

    /**
     * 列出所有子内容分类id。
     *
     * @param ownerType 所有者类型
     * @param ownerId 所有者标识
     * @param parentId 上级分类标识。
     * @return 子分类标识列表。
     */
    public List<Long> listChildrenIds(String ownerType, String ownerId, long parentId, boolean recursion);

    /**
     * 分页查询内容分类。
     *
     * @param ownerType 所有者类型
     * @param ownerId 所有者标识
     * @param criteria:查询条件
     * @param children: 返回数据是否需要包含子内容分类
     * @return 满足条件的内容分类。
     */
    public PagingList<CmsCategory> query(String ownerType, String ownerId, Criteria criteria, boolean children);

    /**
     * 查询内容分类．
     *
     * @param ownerType 所有者类型
     * @param ownerId 所有者标识
     * @param criteria:查询条件
     * @param children:是否需要载入子内容分类数据
     * @return 分类列表。
     */
    public List<CmsCategory> list(String ownerType, String ownerId, Criteria criteria, boolean children);

    /**
     * 查询内容分类．
     *
     * @param criteria:查询条件
     * @param children:是否需要载入子内容分类数据
     * @return 分类列表。
     */
    public PagingList<CmsCategory> query(Criteria criteria, boolean children);
}
